package br.com.virtual.vender.service.impl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.inject.Inject;

import br.com.virtual.base.exceptions.VirtualValidationException;
import br.com.virtual.cadastrar.model.Pessoa;
import br.com.virtual.cadastrar.service.ProdutoService;
import br.com.virtual.vender.dao.ItemVendaDAO;
import br.com.virtual.vender.dao.VendaDAO;
import br.com.virtual.vender.model.ItemVenda;
import br.com.virtual.vender.model.Venda;
import br.com.virtual.vender.service.VendaService;

@Stateless
@Local(VendaService.class)
public class VendaServiceImpl implements VendaService {

	@Inject private VendaDAO vendaDAO;
	@Inject private ItemVendaDAO itemVendaDAO; 
	@EJB private ProdutoService produtoService;

	@Override
	public Venda create(Venda venda) throws VirtualValidationException {

		this.validar(venda);
		
		venda = vendaDAO.create(venda);
		
		for(ItemVenda itemVenda : venda.getItens()){
			itemVenda.setVenda(venda);
			this.itemVendaDAO.create(itemVenda);
			this.produtoService.baixarEstoque(itemVenda.getProduto(), itemVenda.getQuantidade());
		}
		
		return venda;
	}

	private void validar(Venda venda) throws VirtualValidationException {

		List<String> erros = new ArrayList<String>();

		if (venda.getEnderecoEntrega() == null
				|| venda.getEnderecoEntrega().getId() == null) {
			erros.add("Selecione um endereço de entrega.");
		}

		if (!erros.isEmpty())
			throw new VirtualValidationException(erros);

	}

	@Override
	public Venda read(Long id) {
		return vendaDAO.read(id);
	}

	@Override
	public void update(Venda venda) throws VirtualValidationException {
		
		List<ItemVenda> itens = venda.getItens();
		
		vendaDAO.update(venda);
		
		for(ItemVenda itemVenda : itens)
			this.itemVendaDAO.update(itemVenda);
		
//		vendaDAO.update(venda);
	}

	@Override
	public void delete(Venda venda) throws VirtualValidationException {
		
		for(ItemVenda itemVenda : venda.getItens())
			this.itemVendaDAO.delete(itemVenda);
		
		vendaDAO.delete(venda);
	}

	@Override
	public List<Venda> getList() {
		return vendaDAO.getList();
	}

	@Override
	public List<Venda> getListByPessoa(Pessoa pessoa) {
		return this.vendaDAO.getListByPessoa(pessoa);
	}

	@Override
	public List<Venda> getListEmAndamento() {
		return this.vendaDAO.getListEmAndamento();
	}

	@Override
	public List<Venda> getListByPessoaEmAndamento(Pessoa pessoa) {
		return this.vendaDAO.getListByPessoaEmAndamento(pessoa);
	}

	@Override
	public List<ItemVenda> getItens(Venda venda) {
		return vendaDAO.getItens(venda);
	}

}
